package com.javaclimb.accounting.controller;


import com.alibaba.fastjson.JSONObject;
import com.javaclimb.accounting.po.User;
import com.javaclimb.accounting.service.TradeService;
import com.javaclimb.accounting.utils.Consts;
import com.javaclimb.accounting.utils.ReserveUtil;
import com.javaclimb.accounting.vo.Deposit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.math.MathContext;

@SuppressWarnings({"all"})
/**
 * @version jdk1.8
 * @date 2022/12/27 13:56
 * @function:
 */
@RestController
@RequestMapping("/accounting")
public class TradeController {
    @Autowired
    private TradeService tradeService;

    /**
     * 提现                    ----------        xiaoming
     * @param money 提现金额
     * @param userPay 支付密码
     * @param user 用户信息
     * @param cardNumber 银行卡号
     * @param tempNow 银行卡余额
     * @return
     */
    // http://localhost:8888/accounting/trade/withdrawal?money=2000&userName=zhangsan&userPay=010720&cardNumber=561613231325&userAccId=1
    @RequestMapping(value = "/trade/withdrawal",method = RequestMethod.POST)
    public Object drawalOut(BigDecimal money, String userPay, User user,String cardNumber,BigDecimal tempNow) throws Exception {
        JSONObject jsonObject = new JSONObject();
        //先查询电子账户余额
        BigDecimal temp = tradeService.getAccTempById(user.getUserAccId());
        //比较账户余额是否够提现
        if (temp.subtract(money, MathContext.UNLIMITED).compareTo(new BigDecimal(0)) >= 0) {
            tempNow = temp.subtract(money, MathContext.UNLIMITED);
            //先验证是否设置支付密码
            boolean i = tradeService.getUserPay(user.getUserName());
            if (i == true) {
                //在验证支付密码是否正确
                boolean a = tradeService.verifyUserPay(user.getUserName(), userPay);
                if (a == true) {
                      tradeService.drawal(money, user, cardNumber, tempNow);
                      jsonObject.put(Consts.CODE, 1);
                      jsonObject.put(Consts.MSG, "提现成功");
                      return jsonObject;
                    }
                     jsonObject.put(Consts.CODE, 0);
                     jsonObject.put(Consts.MSG, "支付密码错误");
                     return jsonObject;
                    }
                    jsonObject.put(Consts.CODE, 0);
                    jsonObject.put(Consts.MSG, "用户未设置支付密码,请先设置支付密码");
                    return jsonObject;
                   }
                   jsonObject.put(Consts.CODE, 0);
                   jsonObject.put(Consts.MSG, "提现失败,余额不足");
                    return jsonObject;
    }

    /**
     * 设置支付密码接口
     * @param userPay 支付密码
     * @return
     */
    // http://localhost:8888/accounting/trade/addUserPay?userPay=010324&userName=zhangsan
    @RequestMapping(value = "/trade/addUserPay",method = RequestMethod.POST)
    public Object insertUserPay(User user) {
        JSONObject jsonObject = new JSONObject();
        boolean a = tradeService.getUserPay(user.getUserName());
        if (a==true){
            jsonObject.put(Consts.CODE, 0);
            jsonObject.put(Consts.MSG, "该用户已设置过支付密码");
            return jsonObject;
        }else {
                boolean i = tradeService.insertPayPass(user.getUserPay(), user.getUserName());
                if (i == true) {
                    jsonObject.put(Consts.CODE, 1);
                    jsonObject.put(Consts.MSG, "设置支付密码成功");
                    return jsonObject;
                } else {
                    jsonObject.put(Consts.CODE, 0);
                    jsonObject.put(Consts.MSG, "设置支付密码失败");
                    return jsonObject;
                }
            }
    }

    /**
     * 修改支付密码
     * @param userPay 支付密码
     * @return
     */
    // http://localhost:8888/accounting/trade/updateUserPay?userPay=010324&userName=zhangsan
    @RequestMapping(value = "/trade/updateUserPay",method = RequestMethod.POST)
    public Object updateUserPay(User user) {
        JSONObject jsonObject = new JSONObject();
        //判断是否设置过密码
        boolean a = tradeService.getUserPay(user.getUserName());
        if (a == true) {
            String pay = tradeService.getPay(user.getUserName());
            if (pay.equals(user.getUserPay())) {
                jsonObject.put(Consts.CODE, 0);
                jsonObject.put(Consts.MSG, "新密码不能和原密码相同");
                return jsonObject;
            } else {
                    tradeService.updateUserPay(user.getUserName(), user.getUserPay());
                    jsonObject.put(Consts.CODE, 1);
                    jsonObject.put(Consts.MSG, "修改支付密码成功");
                    return jsonObject;
            }
        } else {
                tradeService.updateUserPay(user.getUserName(), user.getUserPay());
                jsonObject.put(Consts.CODE, 1);
                jsonObject.put(Consts.MSG, "修改支付密码成功");
                return jsonObject;
        }
    }


    //========================================================================================================================
    //                          充值   ysy
    //========================================================================================================================
    /**    接口 :http://localhost:8888/accounting/trade/isDeposit   post请求
     *      Deposit表现层类，包含以下参数
           * @param Long userAccId 用户表的电子账户id
           * @param String cardNumber   银行卡号
           * @param BigDecimal onMoney    交易金额
           * @param String userName       用户名
           * @param String userPay       支付密码
     * @return
     */
    @RequestMapping(value = "/trade/isDeposit",method = RequestMethod.POST)
    public Object isDeposit(Deposit deposit) {
        System.out.println(deposit);
        //进行一些数据校验
        JSONObject jsonObject = new JSONObject();

        //是否能传入参数
        if (deposit == null) {
            jsonObject.put(Consts.CODE, 0);
            jsonObject.put(Consts.MSG, "没有传入参数");
            return jsonObject;
        }

          //支付密码去掉空格
        deposit.setUserPay(deposit.getUserPay().trim());
          //判断支付密码是否输入
         if (deposit.getUserPay().equals("")){
               jsonObject.put(Consts.CODE,0);
               jsonObject.put(Consts.MSG,"支付密码没输入");
               return jsonObject;
          }

        //交易金额字段不能为空
        if (deposit.getOnMoney() == null) {
            jsonObject.put(Consts.CODE, 0);
            jsonObject.put(Consts.MSG, "交易金额不能为空");
            return jsonObject;
        }


        //交易金额不能是负数和0
        if (deposit.getOnMoney().toString().equals("0.00") || deposit.getOnMoney().toString().equals("0") || deposit.getOnMoney().toString().indexOf("-") != -1) {
            jsonObject.put(Consts.CODE, 0);
            jsonObject.put(Consts.MSG, "交易金额不能为负数和0");
            return jsonObject;
        }

        //四舍五入保留两位小数
        BigDecimal reserve = ReserveUtil.reserveUtil().reserve(deposit.getOnMoney());



        //判断是否设置支付密码
        boolean isSetUserPay = tradeService.getUserPay(deposit.getUserName());
        if (isSetUserPay == true) {
            //验证支付密码是否正确
            boolean verify = tradeService.verifyUserPay(deposit.getUserName(), deposit.getUserPay());
            //调用service层的是否充值方法
            if (verify == true) {
                int i = tradeService.isDeposit(deposit.getUserAccId(), deposit.getCardNumber(), reserve);
                switch (i){
                    case 2:
                        jsonObject.put(Consts.CODE, 0);
                        jsonObject.put(Consts.MSG, "银行卡余额不足");
                        return jsonObject;

                    case 3:
                        jsonObject.put(Consts.CODE, 0);
                        jsonObject.put(Consts.MSG, "充值失败");
                       return jsonObject;
                    case 4:
                        jsonObject.put(Consts.CODE,0);
                        jsonObject.put(Consts.MSG,"请重新充值");
                        return jsonObject;
                    case 5:
                        jsonObject.put(Consts.CODE,0);
                        jsonObject.put(Consts.MSG,"数据超时");
                        return jsonObject;
                    default:
                        jsonObject.put(Consts.CODE, 1);
                        jsonObject.put(Consts.MSG, "充值成功");
                        return jsonObject;
                }

            }else{
                jsonObject.put(Consts.CODE, 0);
                jsonObject.put(Consts.MSG, "虚拟账户和支付密码不正确");
                return jsonObject;
            }
        }
        jsonObject.put(Consts.CODE, 0);
        jsonObject.put(Consts.MSG, "没有设置支付密码");
        return jsonObject;
    }
}